package Example.singleton;

import annoations.ThreadSafe;

/**
 * 懒汉模式 -》双重同步锁单例模式
 * 单例的实例，在第一次使用的时候进行创建
 *
 * 使用 volatile关键，就不会发生指令重排
 *
 * @author Wang Renlei
 * @Date 2020/7/1
 */
@ThreadSafe
public class SingletonExample5 {

    //私有构造方法
    private SingletonExample5() {

    }

    /**
     * 1、 memory = allocate() 分配对象的内存空间
     * 2、 ctorInstance() 初始化对象
     * 3、 instance = memory 设置instance执行刚分配的内存
     *
     * jvm和cpu优化，发生了指令重排，上面的3步顺序就会发生改变
     * 如果第2步和第3步顺序发生改变，就会出现线程不安全
     *
     */


    //私有单例对象，《《《使用volatile关键字，禁止指令重排》》》
    private volatile static SingletonExample5 instance = null;

    //静态的工程方法
    public static SingletonExample5 getInstance() {
        //双重检测
        if (instance == null) {
            synchronized (SingletonExample5.class) {
                if (instance == null) {
                    instance = new SingletonExample5();
                }
            }
        }
        return instance;
    }
}
